home *** CD-ROM | disk | FTP | other *** search
/ Revista do CD-ROM 97 / CD-ROM 97 / CD-ROM 97.iso / jogos / spherical / Code / Game / sphere.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2002-08-15  |  14.7 KB  |  390 lines

  1.  
  2. // Copyright (C) 2002 by Luigi Pino.  All Rights Reserved.
  3.  
  4. /***************************************************************************/
  5.  
  6. #include "../library/neurosis.h"
  7. #include "draw.h"
  8. #include "file_io.h"
  9. #include "hiscore.h"
  10. #include "initialize.h"
  11. #include "main.h"
  12. #include "menu_misc.h"
  13. #include "paddle.h"
  14. #include "sphere.h"
  15. #include "update.h"
  16.  
  17. /***************************************************************************/
  18.  
  19. extern Object3_Class                    sphere[];
  20. extern Paddle_Struct                    paddle_object[];
  21. extern Sphere_Control_Struct    sphere_object[];
  22. extern Timing_Class                        timing;
  23. extern Values_Struct                    values;
  24.  
  25. extern float3                                    wall_pts[];
  26. extern int                                        goal_by_team;
  27.  
  28. /***************************************************************************/
  29.  
  30. void Check_Closest_Points_Sphere(Movement_Struct *object)
  31.  
  32. {
  33.     int    x1;
  34.     
  35.     object->collision.distance = 2000.0f;
  36.  
  37.     // Boards
  38.     for (x1=1;x1<49;x1=x1+1)
  39.         Get_Closest_Point_2D(&wall_pts[x1], &wall_pts[x1 + 1], object, -1);
  40.  
  41.     for (x1=Up;x1<=Right;x1=x1+1)
  42.         {
  43.             if (paddle_object[x1].game_over == false)
  44.                 {
  45.                     float3 temp_from;
  46.                     float3 temp_to;
  47.  
  48.                     temp_from.x = paddle_object[x1].pts[0].x + paddle_object[x1].movement.current.x;
  49.                     temp_from.y = paddle_object[x1].pts[0].y + paddle_object[x1].movement.current.y;
  50.                     temp_to.x = paddle_object[x1].pts[1].x + paddle_object[x1].movement.current.x;
  51.                     temp_to.y = paddle_object[x1].pts[1].y + paddle_object[x1].movement.current.y;
  52.                     Get_Closest_Point_2D(&temp_from, &temp_to, object, -1);
  53.  
  54.                     temp_from.x = paddle_object[x1].pts[1].x + paddle_object[x1].movement.current.x;
  55.                     temp_from.y = paddle_object[x1].pts[1].y + paddle_object[x1].movement.current.y;
  56.                     temp_to.x = paddle_object[x1].pts[2].x + paddle_object[x1].movement.current.x;
  57.                     temp_to.y = paddle_object[x1].pts[2].y + paddle_object[x1].movement.current.y;
  58.                     Get_Closest_Point_2D(&temp_from, &temp_to, object, -1);
  59.  
  60.                     temp_from.x = paddle_object[x1].pts[2].x + paddle_object[x1].movement.current.x;
  61.                     temp_from.y = paddle_object[x1].pts[2].y + paddle_object[x1].movement.current.y;
  62.                     temp_to.x = paddle_object[x1].pts[3].x + paddle_object[x1].movement.current.x;
  63.                     temp_to.y = paddle_object[x1].pts[3].y + paddle_object[x1].movement.current.y;
  64.                     Get_Closest_Point_2D(&temp_from, &temp_to, object, -1);
  65.  
  66.                     temp_from.x = paddle_object[x1].pts[3].x + paddle_object[x1].movement.current.x;
  67.                     temp_from.y = paddle_object[x1].pts[3].y + paddle_object[x1].movement.current.y;
  68.                     temp_to.x = paddle_object[x1].pts[0].x + paddle_object[x1].movement.current.x;
  69.                     temp_to.y = paddle_object[x1].pts[0].y + paddle_object[x1].movement.current.y;
  70.                     Get_Closest_Point_2D(&temp_from, &temp_to, object, -1);
  71.                 }
  72.         }
  73. }
  74.  
  75. /***************************************************************************/
  76.  
  77. void Goal_Scored(int current_sphere)
  78.  
  79. {
  80.     int x1;
  81.  
  82.     if (sphere_object[current_sphere].goal == true)
  83.         {
  84.             if (sphere_object[current_sphere].seconds_left == -1.0f)
  85.                 {
  86.                     Initialize_Sphere_Object(current_sphere);
  87.                     sphere_object[current_sphere].seconds_left = 3.0f;
  88.                     sphere_object[current_sphere].movement.direction = Get_Random(360.0f);
  89.  
  90.                     for (x1=Up;x1<=Right;x1=x1+1)
  91.                         {
  92.                             if ((values.game_type != Countdown) && (goal_by_team == x1) && (values.game_end_fade != true))
  93.                                 {
  94.                                     paddle_object[x1].score = paddle_object[x1].score + 1.0f;
  95.  
  96.                                     if (paddle_object[x1].time_lapse > paddle_object[x1].time_lapse_score)
  97.                                         paddle_object[x1].time_lapse_score = paddle_object[x1].time_lapse;
  98.  
  99.                                     paddle_object[x1].time_lapse = 0.0f;
  100.                                 }
  101.                         }
  102.                 }
  103.             else
  104.                 {
  105.                     sphere_object[current_sphere].seconds_left = sphere_object[current_sphere].seconds_left - timing.Get_Scale();
  106.                     sphere_object[current_sphere].movement.direction = sphere_object[current_sphere].movement.direction + (250.0f * timing.Get_Scale());
  107.                     Fix_Angle(&sphere_object[current_sphere].movement.direction);
  108.                 }
  109.  
  110.             if (sphere_object[current_sphere].seconds_left <= 0.0f)
  111.                 {
  112.                     sphere_object[current_sphere].goal = false;
  113.                     sphere_object[current_sphere].seconds_left = -1.0f;
  114.  
  115.                     sphere_object[current_sphere].movement.direction = sphere_object[current_sphere].movement.direction - 270.0f;
  116.                     sphere_object[current_sphere].movement.speed = values.sphere_speed;
  117.                 }
  118.         }
  119. }
  120.  
  121. /***************************************************************************/
  122.  
  123. void Initialize_Sphere_Object(int current_sphere)
  124.  
  125. {
  126.     sphere[current_sphere].Load_Model("Data/sphere.dat", t_sphere);
  127.  
  128.     if (values.game_type == Timed)
  129.         {
  130.             values.sphere_speed = 250.0f;
  131.             sphere_object[current_sphere].goal = true;
  132.             sphere_object[current_sphere].seconds_left = -1.0f;
  133.             sphere_object[current_sphere].movement.direction = Get_Random(360.0f);
  134.             sphere_object[current_sphere].movement.collision.radius = Sphere_Radius;
  135.  
  136.             if (current_sphere == 0)
  137.                 {
  138.                     sphere_object[0].movement.current.x = -40.0f;
  139.                     sphere_object[0].movement.current.y = -40.0f;
  140.                     sphere_object[0].movement.current.z = Sphere_Radius;
  141.                     sphere_object[0].movement.speed = 0.0f;
  142.                     sphere[0].Move(&sphere_object[0].movement.current);
  143.                 }
  144.             else if (current_sphere == 1)
  145.                 {
  146.                     sphere_object[1].movement.current.x = 0.0f;
  147.                     sphere_object[1].movement.current.y = 0.0f;
  148.                     sphere_object[1].movement.current.z = Sphere_Radius;
  149.                     sphere_object[1].movement.speed = 0.0f;
  150.                     sphere[1].Move(&sphere_object[1].movement.current);
  151.                 }
  152.             else if (current_sphere == 2)
  153.                 {
  154.                     sphere_object[2].movement.current.x = 40.0f;
  155.                     sphere_object[2].movement.current.y = 40.0f;
  156.                     sphere_object[2].movement.current.z = Sphere_Radius;
  157.                     sphere_object[2].movement.speed = 0.0f;
  158.                     sphere[2].Move(&sphere_object[2].movement.current);
  159.                 }
  160.         }
  161.     else if (values.game_type == Countdown)
  162.         {
  163.             values.sphere_speed = 400.0f;
  164.  
  165.             sphere_object[0].goal = true;
  166.             sphere_object[0].seconds_left = -1.0f;
  167.             sphere_object[0].movement.direction = Get_Random(360.0f);
  168.             sphere_object[0].movement.collision.radius = 10.0f;
  169.             sphere_object[0].movement.current.x = 0.0f;
  170.             sphere_object[0].movement.current.y = 0.0f;
  171.             sphere_object[0].movement.current.z = Sphere_Radius;
  172.             sphere_object[0].movement.speed = 0.0f;
  173.             sphere[0].Move(&sphere_object[0].movement.current);
  174.         }
  175.     else
  176.         {
  177.             values.sphere_speed = 250.0f;
  178.             sphere_object[current_sphere].goal = true;
  179.             sphere_object[current_sphere].seconds_left = -1.0f;
  180.             sphere_object[current_sphere].movement.direction = Get_Random(360.0f);
  181.             sphere_object[current_sphere].movement.collision.radius = Sphere_Radius;
  182.  
  183.             if (current_sphere == 0)
  184.                 {
  185.                     sphere_object[0].movement.current.x = -50.0f;
  186.                     sphere_object[0].movement.current.y = 50.0f;
  187.                     sphere_object[0].movement.current.z = Sphere_Radius;
  188.                     sphere_object[0].movement.speed = 0.0f;
  189.                     sphere[0].Move(&sphere_object[0].movement.current);
  190.                 }
  191.             else if (current_sphere == 1)
  192.                 {
  193.                     sphere_object[1].movement.current.x = 50.0f;
  194.                     sphere_object[1].movement.current.y = 50.0f;
  195.                     sphere_object[1].movement.current.z = Sphere_Radius;
  196.                     sphere_object[1].movement.speed = 0.0f;
  197.                     sphere[1].Move(&sphere_object[1].movement.current);
  198.                 }
  199.             else if (current_sphere == 2)
  200.                 {
  201.                     sphere_object[2].movement.current.x = 50.0f;
  202.                     sphere_object[2].movement.current.y = -50.0f;
  203.                     sphere_object[2].movement.speed = 0.0f;
  204.                     sphere_object[2].movement.current.z = Sphere_Radius;
  205.                     sphere[2].Move(&sphere_object[2].movement.current);
  206.                 }
  207.             else if (current_sphere == 3)
  208.                 {
  209.                     sphere_object[3].movement.current.x = -50.0f;
  210.                     sphere_object[3].movement.current.y = -50.0f;
  211.                     sphere_object[3].movement.current.z = Sphere_Radius;
  212.                     sphere_object[3].movement.speed = 0.0f;
  213.                     sphere[3].Move(&sphere_object[3].movement.current);
  214.                 }
  215.         }
  216.  
  217.     sphere_object[current_sphere].movement.increment.x = 0.0f;
  218.     sphere_object[current_sphere].movement.increment.y = 0.0f;
  219.     sphere_object[current_sphere].movement.increment.z = 0.0f;
  220.  
  221.     if (current_sphere == 0)
  222.         {
  223.             for (int x1=0;x1<sphere[0].Get_Size();x1=x1+1)
  224.                 {
  225.                     color3 color = {0.0f/255.0f, 43.0f/255.0f, 200.0f/255.0f};
  226.                     sphere[0].Set_Color(x1, &color, &color, &color);
  227.                 }
  228.         }
  229.     else if (current_sphere == 1)
  230.         {
  231.             for (int x1=0;x1<sphere[1].Get_Size();x1=x1+1)
  232.                 {
  233.                     color3 color = {232.0f/255.0f, 0.0f/255.0f, 18.0f/255.0f};
  234.                     sphere[1].Set_Color(x1, &color, &color, &color);
  235.                 }
  236.         }
  237.     else if (current_sphere == 2)
  238.         {
  239.             for (int x1=0;x1<sphere[2].Get_Size();x1=x1+1)
  240.                 {
  241.                     color3 color = {255.0f/255.0f, 255.0f/255.0f, 255.0f/255.0f};
  242.                     sphere[2].Set_Color(x1, &color, &color, &color);
  243.                 }
  244.         }
  245.     else if (current_sphere == 3)
  246.         {
  247.             for (int x1=0;x1<sphere[3].Get_Size();x1=x1+1)
  248.                 {
  249.                     color3 color = {255.0f/255.0f, 255.0f/255.0f, 55.0f/255.0f};
  250.                     sphere[3].Set_Color(x1, &color, &color, &color);
  251.                 }
  252.         }
  253.  
  254. }
  255.  
  256. /***************************************************************************/
  257.  
  258. void Next_Position_Sphere(int current_sphere)
  259.  
  260. {
  261.     float    scaled_speed = sphere_object[current_sphere].movement.speed  * timing.Get_Scale();
  262.     float    movement_increase = sphere_object[current_sphere].movement.collision.radius;
  263.     int        x1;
  264.  
  265.     if (sphere_object[current_sphere].movement.speed <= 0.0f)
  266.         sphere_object[current_sphere].movement.speed = 0.0f;
  267.     else
  268.         {
  269.             while (movement_increase == sphere_object[current_sphere].movement.collision.radius)
  270.                 {
  271.                     if (scaled_speed < sphere_object[current_sphere].movement.collision.radius)
  272.                         movement_increase = scaled_speed;
  273.                     else
  274.                         scaled_speed = scaled_speed - sphere_object[current_sphere].movement.collision.radius;
  275.  
  276.                     // Save old position
  277.                     sphere_object[current_sphere].movement.previous.x = sphere_object[current_sphere].movement.current.x;
  278.                     sphere_object[current_sphere].movement.previous.y = sphere_object[current_sphere].movement.current.y;
  279.  
  280.                     // Move current position
  281.                     sphere_object[current_sphere].movement.current.x = sphere_object[current_sphere].movement.current.x + scaled_speed;
  282.                     sphere_object[current_sphere].movement.current.y = sphere_object[current_sphere].movement.current.y;
  283.  
  284.                     Rotate_z(&sphere_object[current_sphere].movement.previous, &sphere_object[current_sphere].movement.current,
  285.                                         sphere_object[current_sphere].movement.direction);
  286.  
  287.                     // Check for collision
  288.                     for (x1=0;x1<values.sphere_number;x1=x1+1)
  289.                         {
  290.                             float temp_angle = 0.0f;
  291.  
  292.                             if (current_sphere != x1)
  293.                                 {
  294.                                     // Store arrow rotation if needed
  295.                                     if (sphere_object[x1].goal == true)
  296.                                         temp_angle = sphere_object[x1].movement.direction;
  297.                                     else if (sphere_object[current_sphere].goal == true)
  298.                                         temp_angle = sphere_object[current_sphere].movement.direction;
  299.  
  300.                                     if (Sphere_Collision_Check(&sphere_object[current_sphere].movement, &sphere_object[x1].movement))
  301.                                         {
  302.                                             Sphere_Collision_Calculate(&sphere_object[current_sphere].movement, &sphere_object[x1].movement, 1.0f);
  303.                                             sphere_object[current_sphere].movement.speed = values.sphere_speed;
  304.                                             sphere_object[x1].movement.speed = values.sphere_speed;
  305.  
  306.                                             if (values.sound == true)
  307.                                                 PlaySound("sound/ball.wav", NULL, SND_ASYNC | SND_FILENAME);
  308.                                         }
  309.  
  310.                                     // Get arrow rotation if needed
  311.                                     if (sphere_object[x1].goal == true)
  312.                                         {
  313.                                             sphere_object[x1].movement.direction = temp_angle;
  314.                                             sphere_object[x1].movement.speed = 0.0f;
  315.                                         }
  316.                                     else if (sphere_object[current_sphere].goal == true)
  317.                                         {
  318.                                             sphere_object[current_sphere].movement.direction = temp_angle;
  319.                                             sphere_object[current_sphere].movement.speed = 0.0f;
  320.                                         }
  321.                                 }
  322.                         }
  323.  
  324.                     Check_Closest_Points_Sphere(&sphere_object[current_sphere].movement);
  325.  
  326.                     if (sphere_object[current_sphere].movement.collision.distance < sphere_object[current_sphere].movement.collision.radius)
  327.                         {
  328.                             if (sphere_object[current_sphere].movement.collision.edge == true)
  329.                                 Collision_Edge_2D(&sphere_object[current_sphere].movement);
  330.                             else
  331.                                 {
  332.                                     float3 temp_from;
  333.                                     float3 temp_to;
  334.  
  335.                                     temp_from.x = sphere_object[current_sphere].movement.collision.from_pts.x;
  336.                                     temp_from.y = sphere_object[current_sphere].movement.collision.from_pts.y;
  337.                                     temp_to.x = sphere_object[current_sphere].movement.collision.to_pts.x;
  338.                                     temp_to.y = sphere_object[current_sphere].movement.collision.to_pts.y;
  339.                                     Collision_Bounce_2D(&temp_from, &temp_to, &sphere_object[current_sphere].movement);
  340.                                 }
  341.  
  342.                             if (values.sound == true)
  343.                                 PlaySound("sound/wall.wav", NULL, SND_ASYNC | SND_FILENAME);
  344.                         }
  345.  
  346.                     // Check for goals
  347.                     if (sphere_object[current_sphere].movement.current.y > (190.0f - sphere_object[current_sphere].movement.collision.radius - 1.0f))
  348.                         {
  349.                             sphere_object[current_sphere].goal = true;
  350.                             goal_by_team = Up;
  351.  
  352.                             if (values.sound == true)
  353.                                 PlaySound("sound/goal.wav", NULL, SND_ASYNC | SND_FILENAME);
  354.                         }
  355.                     else if (sphere_object[current_sphere].movement.current.y < (-190.0f + sphere_object[current_sphere].movement.collision.radius + 1.0f))
  356.                         {
  357.                             sphere_object[current_sphere].goal = true;
  358.                             goal_by_team = Down;
  359.  
  360.                             if (values.sound == true)
  361.                                 PlaySound("sound/goal.wav", NULL, SND_ASYNC | SND_FILENAME);
  362.                         }
  363.                     else if (sphere_object[current_sphere].movement.current.x < (-190.0f + sphere_object[current_sphere].movement.collision.radius + 1.0f))
  364.                         {
  365.                             sphere_object[current_sphere].goal = true;
  366.                             goal_by_team = Left;
  367.  
  368.                             if (values.sound == true)
  369.                                 PlaySound("sound/goal.wav", NULL, SND_ASYNC | SND_FILENAME);
  370.                         }
  371.                     else if (sphere_object[current_sphere].movement.current.x > (190.0f - sphere_object[current_sphere].movement.collision.radius - 1.0f))
  372.                         {
  373.                             sphere_object[current_sphere].goal = true;
  374.                             goal_by_team = Right;
  375.  
  376.                             if (values.sound == true)
  377.                                 PlaySound("sound/goal.wav", NULL, SND_ASYNC | SND_FILENAME);
  378.                         }
  379.  
  380.                     // Calculate increment of sphere position
  381.                     sphere_object[current_sphere].movement.increment.x = sphere_object[current_sphere].movement.current.x - sphere_object[current_sphere].movement.previous.x;
  382.                     sphere_object[current_sphere].movement.increment.y = sphere_object[current_sphere].movement.current.y - sphere_object[current_sphere].movement.previous.y;
  383.                     sphere_object[current_sphere].movement.increment.z = 0.0f;
  384.  
  385.                     sphere[current_sphere].Move(&sphere_object[current_sphere].movement.increment);
  386.                 }
  387.         }
  388. }
  389.  
  390. /***************************************************************************/